import java.util.HashMap;
import java.util.Map;

/**
 * Representa uma direo para movimentao da formiga.
 */
public enum Aim {
	/** Norte, ou para cima. */
	NORTH(-1, 0, 'n'),

	/** Leste , ou direita. */
	EAST(0, 1, 'e'),

	/** Sul, ou para baixo. */
	SOUTH(1, 0, 's'),

	/** Oeste , ou esquerda. */
	WEST(0, -1, 'w'),
	
	EMPTY(0,0, 'x');

	private static final Map<Character, Aim> symbolLookup = new HashMap<Character, Aim>();

	static {
		symbolLookup.put('n', NORTH);
		symbolLookup.put('e', EAST);
		symbolLookup.put('s', SOUTH);
		symbolLookup.put('w', WEST);
	}

	private final int rowDelta;

	private final int colDelta;

	private final char symbol;

	Aim(int rowDelta, int colDelta, char symbol) {
		this.rowDelta = rowDelta;
		this.colDelta = colDelta;
		this.symbol = symbol;
	}

	/**
	 * Returns rows delta.
	 * 
	 * @return rows delta.
	 */
	public int getRowDelta() {
		return rowDelta;
	}

	/**
	 * Returns columns delta.
	 * 
	 * @return columns delta.
	 */
	public int getColDelta() {
		return colDelta;
	}

	/**
	 * Returns symbol associated with this direction.
	 * 
	 * @return symbol associated with this direction.
	 */
	public char getSymbol() {
		return symbol;
	}

	/**
	 * Retorna uma direo de acordo com um simbolo(letra) especificado.
	 * 
	 * @param symbol
	 *            <code>n</code>, <code>e</code>, <code>s</code> or
	 *            <code>w</code> character
	 * 
	 * @return Direo associada ao caractere informado no parmetro
	 */
	public static Aim fromSymbol(char symbol) {
		return symbolLookup.get(symbol);
	}

	/**
	 * 
	 * @param number
	 *            0 - 3
	 * @return
	 */
	public static Aim fromNumber(int number) {
		switch (number) {
		case 0:
			return Aim.EAST;
		case 1:
			return Aim.WEST;
		case 2:
			return Aim.SOUTH;
		default:
			return Aim.NORTH;
		}
	}
}
